// src/hooks/useSocketInteractions.js
import { inject, ref } from 'vue'
import { useUserStore } from '@/store/modules/user/user.js'

export function useSocketInteractions() {
  // 1. 统一注入依赖（组件无需重复注入）
  const socket = inject('socket')
  const userStore = useUserStore()
  console.log('注入的 socket 实例:', socket);
  const isLoading = ref(false) // 全局加载状态（可选，控制按钮loading）

  // 通用错误处理
  const handleError = (msg = '操作失败，请稍后重试') => {
    console.error(msg)
    isLoading.value = false
  }

  // 2. 发送点赞
  const sendLike = async ({ toUserId }) => {
    console.log('=== 点赞时的socket实例 ===', socket);
    console.log('socket是否为undefined:', socket === undefined);
    try {
      isLoading.value = true

      // 通用校验：登录状态
      if (!userStore.isLogin) {
        handleError('请先登录！')
        return
      }

      // 个性化校验：必填参数
      if (!toUserId) {
        handleError('缺少被点赞用户ID！')
        return
      }

      // 发送Socket事件（事件名需和服务端一致）
      await new Promise((resolve, reject) => {
        socket.emit(
          'sendTriggerLike', // 服务端监听的点赞事件名
          {
            toUserId,
            fromUserId: userStore.userInfo.userId
          }, // 传递给服务端的参数
          
          console.log('发送成功');
        (res) => { // 服务端响应回调（需服务端支持返回结果）
          if (res?.success) resolve(res)
          else reject(res?.message || '点赞失败')
        }
        )
    })

    // 成功提示
    console.log('点赞成功！')
  } catch (err) {
    handleError(err.message)
  } finally {
    isLoading.value = false
  }
}

// 3. 发送关注
const sendFollow = async ({ toUserId }) => {
  console.log('socket连接状态:', socket.connected);
  try {
    isLoading.value = true

    // 通用校验：登录状态
    if (!userStore.isLogin) {
      handleError('请先登录！')
      return
    }

    // 个性化校验：必填参数 + 避免自关注
    if (!toUserId) {
      handleError('缺少被关注用户ID！')
      return
    }
    if (userStore.userInfo?.userId === toUserId) {
      handleError('不能关注自己哦！')
      return
    }

    // 发送Socket事件（事件名需和服务端一致）
    await new Promise((resolve, reject) => {
      socket.emit(
        'sendTriggerFollow', // 服务端监听的关注事件名
        {
          toUserId,
          fromUserId: userStore.userInfo.userId
        }, // 传递给服务端的参数
        (res) => {
          if (res?.success) resolve(res)
          else reject(res?.message || '关注失败')
        }
      )
    })
    console.log('关注成功！')
  } catch (err) {
    handleError(err.message)
  } finally {
    isLoading.value = false
  }
}

// 4. 发送评论（支持普通评论和回复评论）
const sendComment = async ({ toVideoId, commentContent, replyId = '' }) => {
  try {
    isLoading.value = true

    // 通用校验：登录状态
    if (!userStore.isLogin) {
      handleError('请先登录！')
      return
    }

    // 个性化校验：必填参数
    if (!toVideoId) {
      handleError('缺少视频ID！')
      return
    }
    if (!commentContent.trim()) {
      handleError('评论内容不能为空！')
      return
    }

    // 发送Socket事件（事件名需和服务端一致）
    await new Promise((resolve, reject) => {
      socket.emit(
        'sendComment', // 服务端监听的评论事件名
        {
          toVideoId, // 目标视频ID
          replyId, // 被回复的评论ID（非回复场景为空）
          content: commentContent.trim(), // 评论内容
          userId: userStore.userInfo.userId, // 评论者ID（当前登录用户）
          userNickname: userStore.userInfo.userNickname // 可选：服务端也可查数据库
        },
        (res) => {
          if (res?.success) resolve(res)
          else reject(res?.message || '评论发送失败')
        }
      )
    })

    console.log('评论发送成功！')
  } catch (err) {
    handleError(err.message)
  } finally {
    isLoading.value = false
  }
}

// 暴露给组件使用的方法和状态
return {
  isLoading,
  sendLike,
  sendFollow,
  sendComment
}
}